Brief analysis of property tax revenue across all states in the U.S.A. 2012 tax data from Brookings. True 2010 population data from the US Census.

By Avi Flamholz


In [1]:
import numpy as np
import pandas as pd
import pylab
import seaborn

from matplotlib.ticker import FuncFormatter
from matplotlib.ticker import NullFormatter

# For plotting monetary values.
def dollars(x, pos):
    'The two args are the value and tick position'
    return '$%d' % (x)
dolla_bills = FuncFormatter(dollars)

xkcd = seaborn.xkcd_rgb

In [2]:
# Read data from excel. Thanks Pandas!
data_df = pd.read_excel('../prop13/state_tax_revenue.xlsx', 'Sheet1', index_col=0)

mean_per_cap = data_df.per_capita_tax_revenue.mean()
med_per_cap = data_df.per_capita_tax_revenue.median()
mean_pct_prop = data_df.prop_tax_pct_local_revenue.mean()
med_pct_prop = data_df.prop_tax_pct_local_revenue.median()

Below I'm plotting the percent of local tax revenues that are from property taxes (per state, 2010) against own-source per-capita tax revenues. Own-source tax revenues excludes tax revenues that come from outside the state, i.e. federal highway funds, etc. I've also plotted histograms for both of these values on the same plot. The dashed yellow green line is the mean value, the dashed teal line is the median value and the dotted-dashed magenta line is where California falls relative to the overall distribution of revenue and property tax percentage.

California is just above the average per-capita tax revenues, collecting ~7,000$/person in 2012. However, it is below the average in terms of the percentage of own-source tax revenue originating from property taxes. California collects ~72% of its own-source tax revenue from property taxes compared to an average of about 75%. Bringing California up to average would mean collecting 4.2% more total tax revenue overall (yearly), which would amount to about 10 billion dollars of annual revenue for local municipalities.

Here is the calculation: 4.2% x 2.7 x $10^{11}$= 10 billion dollars where 2.7e11 dollars was California's total own-source tax revenue in 2012. Recent proposals have suggested that more frequent assessment of commercial real estate in California could generate 9 billion dollars of tax revenue annually, or 90% of the 10 billion dollar gap between California and the average state.

http://www.sacbee.com/news/politics-government/capitol-alert/article23689426.html


In [3]:
# definitions for the axes
left, width = 0.1, 0.65
bottom, height = 0.1, 0.65
bottom_h = left_h = left+width+0.02

rect_scatter = [left, bottom, width, height]
rect_histx = [left, bottom_h, width, 0.2]
rect_histy = [left_h, bottom, 0.2, height]

# start with a rectangular Figure
plt.figure(1, figsize=(12,12))

axScatter = plt.axes(rect_scatter)
axHistx = plt.axes(rect_histx)
axHisty = plt.axes(rect_histy)

# no labels
nullfmt   = NullFormatter() 
axHistx.xaxis.set_major_formatter(nullfmt)
axHisty.yaxis.set_major_formatter(nullfmt)

# Main scatter plot
axScatter.plot(data_df.prop_tax_pct_local_revenue, data_df.per_capita_tax_revenue, 'o', zorder=10)

# Labels for each state
for state in data_df.index:
    axScatter.text(data_df.loc[state]['prop_tax_pct_local_revenue'],
                   data_df.loc[state]['per_capita_tax_revenue'],
                   state, ha='left')

#axScatter.xticks(fontsize=13)
#axScatter.yticks(fontsize=13)
axScatter.set_ylabel('Per Capita Tax Revenue (2010)', fontsize=16)
axScatter.set_xlabel('Pct. Local Tax Revenue From Property Tax (2010)', fontsize=16)
axScatter.yaxis.set_major_formatter(dolla_bills)

axHistx.hist(data_df.prop_tax_pct_local_revenue, bins=30)
axHistx.axvline(med_pct_prop, ls='--', label='median', c=xkcd['mustard'])
axHistx.axvline(mean_pct_prop, ls='--', label='median', c=xkcd['teal'])
axHistx.axvline(data_df.loc['California']['prop_tax_pct_local_revenue'],
                ls='-.', label='median', c=xkcd['magenta'])

axHisty.hist(data_df.per_capita_tax_revenue, bins=40, orientation='horizontal')
axHisty.axhline(med_per_cap, ls='--', label='median', c=xkcd['mustard'])
axHisty.axhline(mean_per_cap, ls='--', label='median', c=xkcd['teal'])
axHisty.axhline(data_df.loc['California']['per_capita_tax_revenue'],
                ls='-.', label='median', c=xkcd['magenta'])

pylab.show()


Sanity check that the state populations implied by the Brookings data for 2012 match up with the data from the census for 2012. Notice the perfect 1:1 correlation in the plot.


In [4]:
pylab.figure(figsize=(10,10))
pylab.xscale('log')
pylab.yscale('log')

# Plot the data
pylab.plot(data_df.actual_pop_2010, data_df.implied_pop_2012, 'o', label='Data')

# Plot a 1:1 trend on the same scale as the data
log_min = np.log10(np.min(data_df.implied_pop_2012)/1.5)
log_max = np.log10(np.max(data_df.implied_pop_2012)*1.5)
xs = np.logspace(log_min, log_max, 30)
pylab.plot(xs, xs, label='1:1 Line')

pylab.legend(loc=2, fontsize=13)
pylab.xticks(fontsize=13)
pylab.yticks(fontsize=13)
pylab.xlabel('Actual State Population (2012 Census)', fontsize=16)
pylab.ylabel('Population Implied by Per Capita Tax Data (2010)', fontsize=16)
pylab.show()



In [ ]: